﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SmartMathLibrary
{
    /// <summary>
    /// Defines a function delegate to bind the method, which represents a real 
    /// function with one real vector argument.
    /// </summary>
    public delegate GeneralVector HardVectorFunctionPointer(GeneralVector vector);

    /// <summary>
    /// Defines a function delegate to bind the method, which represents a bivariate real 
    /// function with two real vector arguments.
    /// </summary>
    public delegate GeneralVector HardBivariateVectorFunctionPointer(GeneralVector a, GeneralVector b);

    /// <summary>
    /// Defines a function delegate to bind the method, which represents a trivariate real 
    /// function with three real vector arguments.
    /// </summary>
    public delegate GeneralVector HardTrivariateVectorFunctionPointer(GeneralVector a, GeneralVector b, GeneralVector c);

    /// <summary>
    /// Defines a function delegate to bind the method, which represents a multivariate real 
    /// function with n real vector arguments.
    /// </summary>
    public delegate GeneralVector HardMultivariateVectorFunctionPointer(GeneralVector[] vectors);

    /// <summary>
    /// Defines a function delegate to bind the method, which represents a complex 
    /// function with one complex vector argument.
    /// </summary>
    public delegate GeneralComplexVector HardComplexVectorFunctionPointer(GeneralComplexVector vector);

    /// <summary>
    /// Defines a function delegate to bind the method, which represents a bivariate complex 
    /// function with two complex vector arguments.
    /// </summary>
    public delegate GeneralComplexVector HardComplexBivariateVectorFunctionPointer(
        GeneralComplexVector a, GeneralComplexVector b);

    /// <summary>
    /// Defines a function delegate to bind the method, which represents a trivariate complex 
    /// function with three complex vector arguments.
    /// </summary>
    public delegate GeneralComplexVector HardComplexTrivariateVectorFunctionPointer(
        GeneralComplexVector a, GeneralComplexVector b, GeneralComplexVector c);

    /// <summary>
    /// Defines a function delegate to bind the method, which represents a multivariate complex 
    /// function with n complex vector arguments.
    /// </summary>
    public delegate GeneralComplexVector HardMultivariateComplexVectorFunctionPointer(GeneralComplexVector[] vectors);

    /// <summary>
    /// Defines a function delegate to bind the method, which represents a real 
    /// function with one real matrix argument.
    /// </summary>
    public delegate Matrix HardMatrixFunctionPointer(Matrix vector);

    /// <summary>
    /// Defines a function delegate to bind the method, which represents a bivariate real 
    /// function with two real matrix arguments.
    /// </summary>
    public delegate Matrix HardBivariateMatrixFunctionPointer(Matrix a, Matrix b);

    /// <summary>
    /// Defines a function delegate to bind the method, which represents a trivariate real 
    /// function with three real matrix arguments.
    /// </summary>
    public delegate Matrix HardTrivariateMatrixFunctionPointer(Matrix a, Matrix b, Matrix c);

    /// <summary>
    /// Defines a function delegate to bind the method, which represents a multivariate real 
    /// function with n real matrix arguments.
    /// </summary>
    public delegate Matrix HardMultivariateMatrixFunctionPointer(Matrix[] vectors);

    /// <summary>
    /// Defines a function delegate to bind the method, which represents a complex 
    /// function with one complex matrix argument.
    /// </summary>
    public delegate ComplexMatrix HardComplexMatrixFunctionPointer(ComplexMatrix vector);

    /// <summary>
    /// Defines a function delegate to bind the method, which represents a bivariate complex 
    /// function with two complex matrix arguments.
    /// </summary>
    public delegate ComplexMatrix HardBivariateComplexMatrixFunctionPointer(ComplexMatrix a, ComplexMatrix b);

    /// <summary>
    /// Defines a function delegate to bind the method, which represents a trivariate complex 
    /// function with three complex matrix arguments.
    /// </summary>
    public delegate ComplexMatrix HardTrivariateComplexMatrixFunctionPointer(
        ComplexMatrix a, ComplexMatrix b, ComplexMatrix c);

    /// <summary>
    /// Defines a function delegate to bind the method, which represents a multivariate complex 
    /// function with n complex matrix arguments.
    /// </summary>
    public delegate ComplexMatrix HardMultivariateComplexMatrixFunctionPointer(ComplexMatrix[] vectors);
}